iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 24
0
Software Development

後端PHP+Laravel--新手實戰日記系列 第 24

Day24-Laravel新手基礎訓-Eloquent: Many to Many (Factory 與 Tinker)

  • 分享至 

  • xImage
  •  

胎嘎侯

來到Many to Many的第2天,遲遲未進關係綁定真是對不住,這裡想跟各位分享的東西實在是太多了啊~
接續昨日創建migration的步驟,由於手邊沒數據,先來跟分享如何建立實用且快速的偽造數據來測試Many to Many的綁定關係。

Factory 模型工廠

想像建構一個生產很多模型玩具的工廠,你需要準備原料與幾道程序才能順利產出。

在預設情況下,工廠名稱來自Eloquent類別,也可以改用資料表來命名。
原料即為利用Faker實例,在return內編寫隨機建立結構化的假資料。

//'name'欄位=>利用$faker產出name屬性的默認測試值
'name'=>$faker->name

--->想依不同情況產出你認為最合適的偽造數據,請參考Faker

把原料都倒進去了,開啟製作程序,該怎麼做呢?
這時我們得好好了解Tinker的作用。

Tinker

Tinker為REPL(read-eval-print loop),中文為「交互式命令行介面」,拆開來看為讀取-求值-輸出的循環,它也是能與資料庫互動的一個實用工具。依據官方文件所示,所有的應用程序都包括Tinker,我們能在command line上與應用程序相互作用。對工程師來說,使用Tinker可以增強開發工作流程。

待會就會看到要如何在tinker內執行factory命令。

使用Factory偽造數據

首先在terminal輸入下列命令,建立factory檔案:

//創建UserVideo Model
php artisan make:model UserVideo

//--model用來綁定工廠與指定的Model名稱。
php artisan make:factory UserFactory --model=User
php artisan make:factory VideoFactory --model=Video
php artisan make:factory UserVideoFactory --model=UserVideo

依檔名輸入要定義的偽造數據內容

UserFactory.php

$factory->define(User::class, function (Faker $faker) {
    return [
        'name'=>$faker->name,
        'email'=>$faker->unique()->safeEmail,
        'email_verified_at'=>now(),
        'password'=>rand(1,999999999),
    ];
});
  • 進入php artisan tinker
  • 輸入factory(App\User::class,10)->create()

除了時間以外,所有特性都是不同的,偽造數據成功!

1

  • 跳出:Ctrl C或輸入Exit
    2

VideoFactory.php

$factory->define(Video::class, function (Faker $faker) {
    return [
        'name'=>$faker->sentence,
    ];
});
  • 進入php artisan tinker
  • 輸入factory(App\Video::class,10)->create()
    4

UserVideoFactory.php

$factory->define(UserVideo::class, function (Faker $faker) {
    return [
        'user_id'=>User::all()->random()->id,
        'video_id'=>Video::all()->random()->id,
        'days'=>rand(1,20),
    ];
});

UserVideo.php

class UserVideo extends Model
{
    protected $table = 'user_video';
}

  • 進入php artisan tinker
  • 輸入factory(App\UserVideo::class,10)->create()
    5

如果沒有綁定protected $table = 'user_video';會出現下列錯誤:

SQLSTATE[42S02]: Base table or view not found: 1146 Table Email_Verification.user_videos' doesn't exist

6

今天落落長的文章就到這裡~明天是雙十連假,放假之餘一起努力完成鐵人賽吧!
Go!

參考圖書:
Laravel 啟動與運行 (Laravel: Up and Running: A Framework for Building Modern PHP Apps)


上一篇
Day23-Laravel新手基礎訓-Eloquent: Many to Many (前言:創建多對多資料表,踩坑大全)
下一篇
Day25-Laravel新手基礎訓-Eloquent: Many to Many 關係綁定
系列文
後端PHP+Laravel--新手實戰日記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言